Go基础知识

Author Avatar
子语 2017 - 09 - 23
  • 在其它设备中阅读本文章

入门

Go语言是一门编译型语言,是一个开源的编程语言,能让构造简单、而且高效的软件变得容易。Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

Go语言环境安装

Go语言安装包下载地址为Golang。Windows使用mis后缀的安装包即可。默认情况msi文件会安装在c:\Go目录下。Go语言的开发工具可以使用LitelDE,是一款开源、跨平台的轻量级Go语言集成开发环境.。也可以在Eclipse或IDEA中安装Go语言插件。

第一个Go程序

package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}

Go的工具链将源代码及其依赖转换成计算机的机器指令(静态编译)。Go提供的工具都通过go命令调用。其中go run就是编译go的源文件,链接库文件,并运行生成的可执行文件。

$ go run helloworld.go

Go语言支持Unicode,可以处理任何语言的文本,包括中文。
如果要编译上述程序,保存编译结果以备将来使用,可以使用build子命令:

$ go build helloworld.go

这个命令生成一个名为helloworld的可执行的二进制文件(注:Windows系统下生成的是helloworld.exe),之后可以随时运行它,不需要任何处理(注:因为是静态编译,所以不必担心系统库更新时的冲突)。

Go语言的代码通过包(package)组织,包类似与其他语言中的库(libraries)或者模块(modules)。一个包由单个目录下的一个或多个go源代码文件组成,目录定义包的作用。每个源文件都以package声明语句为开始。上述例子就是package main,紧跟着导入(import)的包,之后是程序代码。

fmt包含有格式化输出、接收输入的函数,Println是其中一个基础函数。

main包比较特殊,定义了一个独立可执行的程序,而不是一个库。main包中的main函数是整个程序执行时的入口。import声明告诉编译器需要哪些包,缺少必要的包或者导入不需要的包,程序都无法编译通过。

组成程序的函数、变量、常量、类型的声明语句分别由关键字funcvarconsttype定义。一个函数的声明由func关键字、函数名、参数列表、返回值列表(mian函数不含返回值)以及包含在大括号里的函数体组成。Go语言不需在语句末尾添加分号,除非一行有多条语句。

程序结构

命名

Go语言的函数名、变量名、常量名、类型名、语句标号和包名等所有命名的规则是:

(1)由字母、下划线、或数字组成,以字母或下划线开头,区分大小写。
(2)不能使用关键字。Go语言有25个关键字:

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

(3)Go语言还有30多个预定义的名字,如int和true等,对应内建的常量、类型和函数。

内建常量 true false iota nil
内建类型 int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error
内建函数 make len cap new append copy close delete complex real imag panic revover

内部预定义的名字不是关键字,因为可以在定义中重新使用它们。在一些特殊场景重新定义它们时要避免过度而引起的语义混乱。
(4)命名长度没有限制,但应尽量短小。如果作用域较大,生命周期长,应见名知意。
(5)Go语言推荐使用驼峰式命名,而对于ASCIIHTML这样的缩略词则不变,即escapeHTML,而不是escapeHtml
(6)如果一个标识符是在函数内部定义的,那么它只在函数内部有效。如果在函数外部定义,则当前包中所有的文件都可以访问该标识符。名字开头字母的大小写决定了标识符在包外的可见性:如果开头是大写字母,那么它是公开,可被外部包访问,如fmt包的Printf函数就可以在fmt包外访问。包的名字一般总是小写。

声明

声明语句定义了程序的各种实体对象以及部分或全部的属性。Go语言主要有四种类型声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。

(1)一个Go程序对应一个或多个go源文件。每个源文件以包的声明语句开始,说明该文件属于哪个包。之后是import语句,然后是包一级的类型、变量、常量、函数声明语句。
范例:声明常量、函数、变量

package main  // 包声明

import "fmt"  // 导入依赖包

const  boilingF = 212.0   // 定义常量

/**
进行摄氏度和华氏度的转换
 */
func main() {   // 定义函数
	var f = boilingF   // 定义变量
	var c = (f - 32) * 5 / 9
	fmt.Printf("boiling point = %g°F or %g°C\n", f, c)
}

上述代码中,bilingF是包级别的声明,作用范围为包内的所有文件。f和c是在函数内部声明的,作用范围仅在函数内部。

(2)一个函数的声明由函数名、参数、可选的返回值和函数体组成。如果没有返回值,就可不定义返回值。函数的执行从第一个语句,依次执行直到遇到return语句或执行完毕。
如果要多次进行摄氏度与华氏度的转换,可以将其定义为函数。

package main

import "fmt"

func main() {
	const freezingF, boilingF = 32.0, 212.0
	fmt.Printf("%g°F = %g°C\n", freezingF, fToC(freezingF))
	fmt.Printf("%g°F = %g°C\n", boilingF, fToC(boilingF))
}

/** 华氏度转为摄氏度
 * f: 华氏度值
 * return: 返回float64类型数据
 */
func fToC(f float64) float64  {
	return (f - 32) * 5 / 9
}

变量

变量声明的一般语法:var 变量名 类型 = 表达式

类型或表达式可省略其一。如果省略类型,则根据表达式推断变量的类型;如果省略表达式,则变量的值为默认值:

数据类型 初始值
数值类型 0
布尔型 false
字符串型 空字符串
接口或引用类型(包括slice、指针、map、chan和函数) nil
数组或结构体等聚合类型 每个元素或字段对应该类型的初始值

Go的零值初始化机制可以保证每个变量都被初始化,因此Go中不存在未初始化的变量。这个特性可以简化很多代码,在不增加额外工作的情况下,确保边界条件下的合理行为。

可以在声明语句中同时声明一组变量,或用一组初始化表达式声明并初始化一组变量,如果忽略每个变量的类型,就可以声明多个不同类型变量(类型由初始表达式推导)

var i, j, k int  // int, int, int
var b, f, s = true, 2.3, "four"  // bool, float64, string

变量也可以通过调用函数,由函数的返回值进行初始化:

var f, err = os.Open(name)

简短变量声明

简短变量声明,变量的类型根据表达式自动推导,语法变量名 := 表达式

因为其简洁灵活的特点,简短变量声明常用于大部分的局部变量;var声明常用于需要显示变量类型的地方或者变量稍后会被重新赋值的而初始值无关紧要的地方。

i := 100
var boilong float64 = 100
var name []string

简短变量声明也同var一样可以声明一组变量,表达式可以是函数。
(1)简短变量声明左边的变量如果是已经被声明过的,那么此时该语句对该变量的作用只是赋值(简短变量声明一句中至少有一个变量是新地!)

in, err := os.Open(infile)
out, err := os.Open(outfile)  // 此时":=" 对于err只是进行赋值
out, err := os.Create(outfile) // 报错,没有新的变量

解决上述错误的方法是将第二个简短变量声明改为普通的多重赋值语句。

简短变量声明只对已经在同级作用范围声明的变量起到赋值作用,如果是作用域外的声明,则会在当前作用域重新声明一个新的变量。

指针

This blog is under a CC BY-NC-SA 3.0 Unported License
本文链接:http://yov.oschina.io/article/Go/Go Base/Go基础知识/